import _ from 'lodash';

const ComponentDefinitionMap = {};

/**
 * 从组件开发时定义的data.config.js和main.config.js解析得出
 * 用于定义和维护单个组件的可配置项（样式、交互、主题等）
 *
 * 这里的配置项并未经过 reduceConfig 工具函数转换过，所以是数组而不是对象
 */
class ComponentDefinition {
	/**
	 * 组件定义id（组件库表数据库主键）
	 *
	 * @memberof ComponentDefinition
	 */
	id = '';
	/**
	 * 组件显示名称
	 *
	 * @memberof ComponentDefinition
	 */
	name = '';
	/**
	 * 组件名称字段，在组件注册时会与版本字段加上前缀作为组件的注册名以确保唯一性
	 *
	 * @memberof ComponentDefinition
	 */
	moduleName = '';
	/**
	 * 组件版本
	 *
	 * @memberof ComponentDefinition
	 */
	version = '';
	/**
	 * 组件类型，枚举：0（普通组件）、1（容器类组件）
	 *
	 * @memberof ComponentDefinition
	 */
	cpntType = 0;
	/**
	 *  默认静态数据
	 */

	height = 0;
	width = 0;
	left = 0;
	top = 0;
	right = 0;
	bottom = 0;
	positionType = 0;

	icon = '';

	data = [];
	/**
	 * 校验字段
	 *
	 * @memberof ComponentDefinition
	 */
	fields = [];
	/**
	 * 组件内部状态
	 *
	 * @memberof ComponentDefinition
	 */
	status = [];
	/**
	 * 组件事件（暴露组件内部事件）
	 *
	 * @memberof ComponentDefinition
	 */
	events = [];
	/**
	 * 组件动作（暴露组件内部操作）(默认动作：关闭、显示、隐藏)
	 *
	 * @memberof ComponentDefinition
	 */
	actions = [];
	/**
	 * 组件其他配置（位置、大小、样式、标题、图标、可拖拽、可关闭）
	 *
	 * @memberof ComponentDefinition
	 */
	configuration = [];
	// /**
	//  * 组件样式配置
	//  *
	//  * @memberof ComponentDefinition
	//  */
	// style = []
	/**
	 * 组件主题配置
	 *
	 * @memberof ComponentDefinition
	 */
	theme = {};

	/**
	 * 获取组件注册名
	 * @param {*} prefix : ;
	 * @returns
	 */
	getRegistrationName = (prefix = '') => {
		return `${prefix}_${this.name}_${this.version}`;
	};

	constructor(definition = {}) {
		this.id = _.get(definition, 'id', '');
		this.name = _.get(definition, 'name', '');
		this.moduleName = _.get(definition, 'moduleName', '');
		this.version = _.get(definition, 'version', '');
		this.cpntType = _.get(definition, 'cpntType', 0);

		this.height = _.get(definition, 'height', 0);
		this.width = _.get(definition, 'width', 0);
		this.left = _.get(definition, 'left', 0);
		this.top = _.get(definition, 'top', 0);
		this.right = _.get(definition, 'right', 0);
		this.bottom = _.get(definition, 'bottom', 0);
		this.positionType = _.get(definition, 'positionType', 0);

		this.icon = _.get(definition, 'icon', '');
		// this.border = _.get(definition, "border", "")

		this.data = _.get(definition, 'data', []);
		this.fields = _.get(definition, 'fields', []);
		this.status = _.get(definition, 'status', []);
		this.events = _.get(definition, 'events', []);
		this.actions = _.get(definition, 'actions', []);
		this.configuration = _.get(definition, 'configuration', []);
		// this.style _.get(=, inition.style || [])
		this.theme = _.get(definition, 'theme', {});
	}
}

export default ComponentDefinition;

/**
 * CIF内部全局存储组件定义用
 */
export const ComponentDefinitionHelper = {
	getDef(id) {
		return ComponentDefinitionMap[id] || undefined;
	},
	setDef(definition) {
		if (!definition || !definition.id) {
			return false;
		} else {
			ComponentDefinitionMap[definition.id] = definition;
			return true;
		}
	}
};
